import Component from '@glimmer/component';
import ghostPaths from 'ghost-admin/utils/ghost-paths';
import {action} from '@ember/object';
import {inject as service} from '@ember/service';
import {tracked} from '@glimmer/tracking';

export default class GhKoenigEditorReactComponent extends Component {
    @service settings;

    containerElement = null;
    titleElement = null;
    // koenigEditor = null;
    mousedownY = 0;
    uploadUrl = `${ghostPaths().apiRoot}/images/upload/`;

    @tracked titleIsHovered = false;
    @tracked titleIsFocused = false;

    get title() {
        return this.args.title === '(Untitled)' ? '' : this.args.title;
    }

    get accentColor() {
        const color = this.settings.accentColor;
        if (color && color[0] === '#') {
            return color.slice(1);
        }
        return color;
    }

    @action
    registerElement(element) {
        this.containerElement = element;
    }

    @action
    trackMousedown(event) {
        // triggered when a mousedown is registered on .gh-koenig-editor-pane
        this.mousedownY = event.clientY;
    }

    // Title actions -----------------------------------------------------------

    @action
    registerTitleElement(element) {
        this.titleElement = element;

        // this is needed because focus event handler won't be fired if input has focus when rendering
        if (this.titleElement === document.activeElement) {
            this.titleIsFocused = true;
        }
    }

    @action
    updateTitle(event) {
        this.args.onTitleChange?.(event.target.value);
    }

    @action
    cleanPastedTitle(event) {
        const pastedText = (event.clipboardData || window.clipboardData).getData('text');

        if (!pastedText) {
            return;
        }

        event.preventDefault();

        const cleanValue = pastedText.replace(/(\n|\r)+/g, ' ').trim();
        document.execCommand('insertText', false, cleanValue);
    }

    @action
    focusTitle() {
        this.titleElement.focus();
    }

    // @action
    // onTitleKeydown(event) {
    //     let value = event.target.value;
    //     let selectionStart = event.target.selectionStart;

    //     // enter will always focus the editor
    //     // down arrow will only focus the editor when the cursor is at the
    //     // end of the input to preserve the default OS behaviour
    //     if (
    //         event.key === 'Enter' ||
    //         event.key === 'Tab' ||
    //         ((event.key === 'ArrowDown' || event.key === 'ArrowRight') && (!value || selectionStart === value.length))
    //     ) {
    //         event.preventDefault();

    //         // on Enter we also want to create a blank para if necessary
    //         if (event.key === 'Enter') {
    //             this._addParaAtTop();
    //         }

    //         this.koenigEditor.focus();
    //     }
    // }

    // Body actions ------------------------------------------------------------

    // @action
    // onEditorCreated(koenig) {
    //     this._setupEditor(koenig);
    //     this.args.onEditorCreated?.(koenig);
    // }

    // @action
    // focusEditor(event) {
    //     if (event.target.classList.contains('gh-koenig-editor-pane')) {
    //         let editorCanvas = this.koenigEditor.element;
    //         let {bottom} = editorCanvas.getBoundingClientRect();

    //         // if a mousedown and subsequent mouseup occurs below the editor
    //         // canvas, focus the editor and put the cursor at the end of the
    //         // document
    //         if (this.mousedownY > bottom && event.clientY > bottom) {
    //             let {post} = this.koenigEditor;
    //             let range = post.toRange();
    //             let {tailSection} = range;

    //             event.preventDefault();
    //             this.koenigEditor.focus();

    //             // we should always have a visible cursor when focusing
    //             // at the bottom so create an empty paragraph if last
    //             // section is a card
    //             if (tailSection.isCardSection) {
    //                 this.koenigEditor.run((postEditor) => {
    //                     let newSection = postEditor.builder.createMarkupSection('p');
    //                     postEditor.insertSectionAtEnd(newSection);
    //                     tailSection = newSection;
    //                 });
    //             }

    //             this.koenigEditor.selectRange(tailSection.tailPosition());

    //             // ensure we're scrolled to the bottom
    //             this.containerElement.scrollTop = this.containerElement.scrollHeight;
    //         }
    //     }
    // }

    // _setupEditor(koenig) {
    //     let component = this;

    //     this.koenigEditor = koenig;

    //     // focus the title when pressing SHIFT+TAB
    //     this.koenigEditor.registerKeyCommand({
    //         str: 'SHIFT+TAB',
    //         run() {
    //             component.focusTitle();
    //             return true;
    //         }
    //     });
    // }

    // _addParaAtTop() {
    //     if (!this.koenigEditor) {
    //         return;
    //     }

    //     let editor = this.koenigEditor;
    //     let section = editor.post.toRange().head.section;

    //     // create a blank paragraph at the top of the editor unless it's already
    //     // a blank paragraph
    //     if (section.isListItem || !section.isBlank || section.text !== '') {
    //         editor.run((postEditor) => {
    //             let {builder} = postEditor;
    //             let newPara = builder.createMarkupSection('p');
    //             let sections = section.isListItem ? section.parent.parent.sections : section.parent.sections;

    //             postEditor.insertSectionBefore(sections, newPara, section);
    //         });
    //     }
    // }
}
